<?php

namespace app\index\model;

use think\Controller;
use think\facade\Session;

//use think\Cookie;

use think\facade\Cookie;

class Wechat extends Controller {

    protected $appid;

    protected $appKey;

    public $data = null;

    public function __construct($appid, $appKey)
    {

        $this->appid = $appid; //微信支付申请对应的公众号的APPID
        $this->appKey = $appKey; //微信支付申请对应的公众号的APP Key
    }

    /**
     * 通过跳转获取用户的openid，跳转流程如下：
     * 1、设置自己需要调回的url及其其他参数，跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
     * 2、微信服务处理完成之后会跳转回用户redirect_uri地址，此时会带上一些参数，如：code
     *
     * @return 用户的openid
     */
    public function GetOpenid($code = '')
    {

        //通过code获得openid
        if ($code == ''){
            Session::set('target_url',$_SERVER['REQUEST_URI']);
            //触发微信返回code码
            $baseUrl = $this->getCurrentUrl();
            // echo $baseUrl;
            // exit;
            // echo '<pre>';
            // print_r($_SERVER);
            // exit;
            $url = $this->__CreateOauthUrlForCode($baseUrl);
            // header("Access-Control-Allow-Origin:*");
            // header("Access-Control-Allow-Methods:GET, POST, OPTIONS, DELETE");
            // header("Access-Control-Allow-Headers:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, Accept-Language, Origin, Accept-Encoding");
            // Header("Location: $url");
//            file_put_contents(dirname(__FILE__).'/url',json_encode($url));
            $this->redirect($url,302);
            // redirect($url);
            // echo 1;
            exit;

        } else {

            //获取code码，以获取openid
            // $code = $_GET['code'];
            Cookie::set('w_code',$code,300);
            $openid = $this->getOpenidFromMp($code);
            return $openid;
        }
    }


    public function getCurrentUrl()
    {
        $scheme = 'http://';
        $uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];
        // if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI'];
        $baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].'/index/Wechatlogin/we_login');
        return $baseUrl;
    }


    public function getCurrentUrl1()
    {
        // $scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';
        $scheme = 'http://';
        $uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];
        if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI'];
        $baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri);
        return $baseUrl;
    }


    /**
     * 通过code从工作平台获取openid机器access_token
     * @param string $code 微信跳转回来带上的code
     * @return openid
     */

    public function GetOpenidFromMp($code)
    {
        $url = $this->__CreateOauthUrlForOpenid($code);
        $res = self::curlGet($url);
        $data = json_decode($res,true);
        $this->data = $data;
        return $data;
    }



    /**
     * 构造获取open和access_toke的url地址
     * @param string $code，微信跳转带回的code
     * @return 请求的url
     */
    private function __CreateOauthUrlForOpenid($code)
    {
        $urlObj["appid"] = $this->appid;

        $urlObj["secret"] = $this->appKey;

        $urlObj["code"] = $code;

        $urlObj["grant_type"] = "authorization_code";

        $bizString = $this->ToUrlParams($urlObj);

        return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;

    }



    /**

     * 构造获取code的url连接

     * @param string $redirectUrl 微信服务器回跳的url，需要url编码

     * @return 返回构造好的url

     */

    private function __CreateOauthUrlForCode($redirectUrl)

    {

        $urlObj["appid"] = $this->appid;

        $urlObj["redirect_uri"] = "$redirectUrl";

        $urlObj["response_type"] = "code";

        $urlObj["scope"] = "snsapi_userinfo";

        $urlObj["state"] = "STATE";

        $bizString = $this->ToUrlParams($urlObj);

        return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;

    }



    /**

     * 拼接签名字符串

     * @param array $urlObj

     * @return 返回已经拼接好的字符串

     */

    private function ToUrlParams($urlObj)

    {

        $buff = "";

        foreach ($urlObj as $k => $v)

        {

            if($k != "sign") $buff .= $k . "=" . $v . "&";

        }

        $buff = trim($buff, "&");

        return $buff;

    }



    /**

     * 获取用户信息

     * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid

     * @return string

     */

    public function getUserInfo($openid,$access_token)

    {



        $response = self::curlGet('https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN');

        return json_decode($response,true);



    }



    public static function curlGet($url = '', $options = array())
    {

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }

        //https请求 不验证证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }



    public static function curlPost($url = '', $postData = '', $options = array())

    {

        if (is_array($postData)) {

            $postData = http_build_query($postData);

        }

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数

        if (!empty($options)) {

            curl_setopt_array($ch, $options);

        }

        //https请求 不验证证书和host

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        $data = curl_exec($ch);

        curl_close($ch);

        return $data;

    }

}
